package com.example.basefream.util;

import com.google.common.base.Strings;

public abstract class ErrorUtil {

    //主键/唯一键冲突的异常信息
    public static final String UNIQUE_ERROR = "Duplicate entry";

    //判断返回的Message是否含有 UNIQUE_ERROR主键冲突。
    public static String getErrorCode(Exception e) {
        String errorCode = "";
        if (e.getCause() != null && e.getCause().getMessage() != null) {
            errorCode = e.getCause().getMessage();
        }
        if (Strings.isNullOrEmpty(errorCode) && e.getMessage() != null) {
            errorCode = e.getMessage();
        }
        return errorCode;
    }


    /**
     * 获取到异常描述
     *
     * @param e 异常信息
     * @return "异常信息||异常类名||异常位置"
     */
    public static String getLogErrorMessage(Exception e) {
        StackTraceElement[] stackTrace = e.getStackTrace();
        StackTraceElement stackTraceElement = null;
        if (stackTrace != null && stackTrace.length >= 1) {
            stackTraceElement = stackTrace[0];
        }
        return e.getMessage() + "||" + e.getClass().getSimpleName() + "||" + stackTraceElement;
    }

    /**
     * 判断抛出的异常是否包含某类异常
     *
     * @param throwable 抛出的异常
     * @param clazz     是否包含的异常类
     * @return true表示throwable中包含clazz的异常，false表示throwable中不包含clazz异常。
     */
    public static boolean containThrowable(Throwable throwable, Class<? extends Throwable> clazz) {
        boolean result = false;
        Throwable t = throwable;
        while (t != null) {
            if (clazz.isAssignableFrom(t.getClass())) {
                result = true;
                break;
            }
            t = t.getCause();
        }
        return result;
    }


}
